const express = require('express');
const app = express();
const port = 3000;

// 定义一个长文本
const longText = `这是一个非常长的文本示例，用于演示流式返回数据的功能。
在实际应用中，这个长文本可能是从数据库中查询得到的大篇幅内容，
或者是通过复杂计算生成的结果。通过流式返回，客户端可以在数据生成的过程中
逐步接收和处理数据，而不需要等待整个数据块都准备好才开始操作。
这对于处理大数据量的情况非常有用，能够提高系统的响应性能和用户体验。
下面将逐步发送这个长文本的各个部分。`;

// 定义一个路由，用于流式返回长文本
app.get('/stream', (req, res) => {
    // 设置响应头，指定内容类型为文本流
    res.setHeader('Content-Type', 'text/plain; charset=utf-8');
    // 设置响应头，指定传输编码为分块传输
    res.setHeader('Transfer-Encoding', 'chunked');
    res.setHeader('Access-Control-Allow-Origin', '*');

    // 定义每个数据块的大小
    const chunkSize = 10;
    let startIndex = 0;

    // 定义一个函数，用于发送数据块
    const sendChunk = () => {
        if (startIndex < longText.length) {
            // 计算当前数据块的结束索引
            const endIndex = Math.min(startIndex + chunkSize, longText.length);
            // 提取当前数据块
            const chunk = longText.slice(startIndex, endIndex);
            // 发送数据块
            res.write(chunk);
            // 更新起始索引
            startIndex = endIndex;
            // 模拟延迟，以便观察流式传输效果
            setTimeout(sendChunk, 200);
        } else {
            // 所有数据块发送完毕，结束响应
            res.end();
        }
    };

    // 开始发送第一个数据块
    sendChunk();
});

// 启动服务器
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});